package persistance;

import java.util.ArrayList;

import extras.Dispositivo;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * clase encargada de manejar toda la funcionalidad asociada con la persistencia
 * en la BD
 * 
 * @author Marco
 * 
 */
public class Persistencia extends SQLiteOpenHelper {
	// nombre de la base de datos
	static final String DB_NAME = "persistencia";

	static final String TABLA_DISPOSITIVOS = "dispositivos";

	static final String TABLA_HACK = "hackGuardian";

	static final String ID = "_ID";
	static final String COLUMNA_SSID = "ssid";
	static final String COLUMNA_NOMBRE = "nombre";

	public Persistencia(Context pContext) {
		super(pContext, DB_NAME, null, 1);

	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE " + TABLA_DISPOSITIVOS + " ( " + ID
				+ " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMNA_SSID
				+ " VARCHAR(20)UNIQUE, " + COLUMNA_NOMBRE + " VARCHAR(50) )");
		db.execSQL("CREATE TABLE " + TABLA_HACK + " ( " + ID
				+ " INTEGER PRIMARY KEY )");

	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub

	}

	/**
	 * Metodo para insertar un nuevo dispositivo en la BD
	 */
	public boolean inserterDispositivo(String ssid, String nombre) {

		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		nuevoRegistro.put(COLUMNA_SSID, ssid);
		nuevoRegistro.put(COLUMNA_NOMBRE, nombre);
		db.insert(TABLA_DISPOSITIVOS, null, nuevoRegistro);
		db.close();
		return true;

	}

	/**
	 * Metodo para obtener la cantidad de dispositvos registrados
	 */
	public int getCantidadDispositivos() {
		String countQuery = "SELECT  * FROM " + TABLA_DISPOSITIVOS
				+ " ORDER BY " + ID;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(countQuery, null);
		int cnt = cursor.getCount();
		cursor.close();
		db.close();
		return cnt;
	}

	/*
	 * Obtengo todos los nombres de los dispositivos registrados y los desvuelvo
	 * en un vecgtor para presentarlos en un dialogo a modo de seleccion
	 */
	public String[] getDispositivosRegistrados() {
		String[] dispositivos = null;
		SQLiteDatabase db = getReadableDatabase();

		Cursor cursoDispositivos = db.query(TABLA_DISPOSITIVOS, null, null,
				null, null, null, null);
		if (cursoDispositivos.getCount() > 0) {
			dispositivos = new String[cursoDispositivos.getCount()];
			int i = 0;
			while (cursoDispositivos.moveToNext()) {
				dispositivos[i] = cursoDispositivos.getString(cursoDispositivos
						.getColumnIndex(COLUMNA_NOMBRE));
				i++;
			}
		}
		cursoDispositivos.close();
		db.close();
		return dispositivos;

	}
	
	/*
	 * Obtengo todos los nombres de los dispositivos registrados y los desvuelvo
	 * en un vecgtor para presentarlos en un dialogo a modo de seleccion
	 */
	public ArrayList getpDispositivosRegistrados() {
		ArrayList mDispositivos = null;
		SQLiteDatabase db = getReadableDatabase();

		Cursor cursoDispositivos = db.query(TABLA_DISPOSITIVOS, null, null,
				null, null, null, null);
		if (cursoDispositivos.getCount() > 0) {
			mDispositivos = new ArrayList();
			while (cursoDispositivos.moveToNext()) {
				Dispositivo mDispositivo = new Dispositivo();
				mDispositivo.setId(cursoDispositivos.getInt(cursoDispositivos
						.getColumnIndex(ID)));
				mDispositivo.setNombre( cursoDispositivos.getString(cursoDispositivos
						.getColumnIndex(COLUMNA_NOMBRE)));
				mDispositivo.setSsid( cursoDispositivos.getString(cursoDispositivos
						.getColumnIndex(COLUMNA_SSID)));
				mDispositivos.add(mDispositivo);
		
			}
		}
		cursoDispositivos.close();
		db.close();
		return mDispositivos;

	}

	/**
	 * El metodo recive un id (el cual se obtiene como posicion de la lista que
	 * presenta el dialogo) y en base a ese id recupera el SDD correspondiente..
	 * como el dialogo muestra la lista con una consulta con un order by por id,
	 * nos aseguramos que el id coincide con la posicion
	 * 
	 * @param id
	 * @return
	 */
	public String getSSID(int id) {
		String retorno = null;
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursorSSD = db.query(TABLA_DISPOSITIVOS, null, ID + "=?",
				new String[] { String.valueOf(id) }, null, null, null);
		if (cursorSSD.moveToNext()) {
			retorno = cursorSSD.getString(cursorSSD
					.getColumnIndex(COLUMNA_SSID));

		}
		cursorSSD.close();
		db.close();
		return retorno;
	}
	
	/**
	 * MEtodo para recuperar le nombre de un dispo sitivo con su id
	 * 
	 */
	public String getNombre(int id) {
		String retorno = null;
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursorSSD = db.query(TABLA_DISPOSITIVOS, null, ID + "=?",
				new String[] { String.valueOf(id) }, null, null, null);
		if (cursorSSD.moveToNext()) {
			retorno = cursorSSD.getString(cursorSSD
					.getColumnIndex(COLUMNA_NOMBRE));

		}
		cursorSSD.close();
		db.close();
		return retorno;
	}
	
	/**
	 * Metodo para actualizar un dispositivo
	 */
	
	public boolean updateDispositivo(Dispositivo dis){
		SQLiteDatabase db = getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		String whereClause = ID +" =?";
		nuevoRegistro.put(COLUMNA_SSID, dis.getSsid());
		nuevoRegistro.put(COLUMNA_NOMBRE, dis.getNombre());
		db.update(TABLA_DISPOSITIVOS, nuevoRegistro, whereClause, new String[]{""+dis.getId()});
		return true;
		
	}

	/**
	 * metodo para determinar si existe un dispositvo registrado con esa id
	 * 
	 * @param ssid
	 * @return
	 */

	public boolean existeSSID(String ssid) {
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursorSSD = db.query(TABLA_DISPOSITIVOS, null, COLUMNA_SSID
				+ "=?", new String[] { ssid }, null, null, null);
		if (cursorSSD.moveToNext()) {
			cursorSSD.close();
			db.close();
			return true;

		} else {
			cursorSSD.close();
			db.close();
			return false;
		}

	}

	/**
	 * inserta los id de lso dispositivos seleccionados a rastreat hack para las
	 * preferences
	 * 
	 * @return
	 */
	public boolean insertarID(ArrayList<Integer> listaId) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.execSQL("DELETE FROM " + TABLA_HACK);
		if (listaId != null && listaId.size() > 0) {
			for (Integer inte : listaId) {
				ContentValues nuevoRegistro = new ContentValues();
				nuevoRegistro.put(ID, inte);
				db.insert(TABLA_HACK, null, nuevoRegistro);

			}
		}
		db.close();
		return true;

	}

	public String[] getRegistradasGuardian() {
		String[] dispositivos = null;
		SQLiteDatabase db = getReadableDatabase();
		String consulta = "Select " + TABLA_DISPOSITIVOS + "." + COLUMNA_SSID
				+ " FROM " + TABLA_DISPOSITIVOS + "," + TABLA_HACK + " WHERE "
				+ TABLA_DISPOSITIVOS + "." + ID + " = " + TABLA_HACK + "." + ID;

		Cursor cursoDispositivos = db.rawQuery(consulta, new String[] {});
		if (cursoDispositivos.getCount() > 0) {
			dispositivos = new String[cursoDispositivos.getCount()];
			int i = 0;
			while (cursoDispositivos.moveToNext()) {
				dispositivos[i] = cursoDispositivos.getString(0);
				i++;
			}
		}
		cursoDispositivos.close();
		db.close();
		return dispositivos;

	}

	/**
	 * obtiene los id d elso dispositivos registrados para ser monitoread pero
	 * los devuelve en format de array list para poder mostrar cuales estan
	 * chekeados en el dialogo
	 * 
	 * @return
	 */
	public ArrayList<Integer> getRegistradasGuardianArray() {
		ArrayList<Integer> dispositivos = null;
		SQLiteDatabase db = getReadableDatabase();
		String consulta = "Select " + TABLA_DISPOSITIVOS + "." + ID + " FROM "
				+ TABLA_DISPOSITIVOS + "," + TABLA_HACK + " WHERE "
				+ TABLA_DISPOSITIVOS + "." + ID + " = " + TABLA_HACK + "." + ID;

		Cursor cursoDispositivos = db.rawQuery(consulta, new String[] {});
		if (cursoDispositivos.getCount() > 0) {
			dispositivos = new ArrayList<Integer>();

			while (cursoDispositivos.moveToNext()) {
				dispositivos.add(cursoDispositivos.getInt(0) - 1);// el menos
																	// uno es
																	// por el
																	// defasaje
				// no deberia ser asi deberia modficalro a mas alto nivel pero
				// pro ahro lo dejamso

			}
		}
		cursoDispositivos.close();
		db.close();
		return dispositivos;

	}

}
